/**
 * @file /include/ui_core/qnode.hpp
 *
 * @brief Communications central!
 *
 * @date February 2011
 **/
/*****************************************************************************
** Ifdefs
*****************************************************************************/

#ifndef ui_core_QNODE_HPP_
#define ui_core_QNODE_HPP_

/*****************************************************************************
** Includes
*****************************************************************************/

// To workaround boost/qt4 problems that won't be bugfixed. Refer to
//    https://bugreports.qt.io/browse/QTBUG-22829
#ifndef Q_MOC_RUN
#include <ros/ros.h>
#endif
#include <string>
#include <QThread>
#include <QStringListModel>
#include <std_msgs/Int32MultiArray.h>

#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <QImage>
/*****************************************************************************
** Namespaces
*****************************************************************************/

namespace ui_core {

/*****************************************************************************
** Class
*****************************************************************************/

class QNode : public QThread {
    Q_OBJECT
public:
	QNode(int argc, char** argv );
	virtual ~QNode();
	bool init();
	bool init(const std::string &master_url, const std::string &host_url);
	void run();
        void send_rectangle_topic(std_msgs::Int32MultiArray int32M_Tmp);

  void sub_image(QString topic_name);//接口函数，向UI发送OpenCV类型图像
	/*********************
	** Logging
	**********************/
	enum LogLevel {
	         Debug,
	         Info,
	         Warn,
	         Error,
	         Fatal
	 };

	QStringListModel* loggingModel() { return &logging_model; }
	void log( const LogLevel &level, const std::string &msg);

Q_SIGNALS:
  void loggingUpdated();
  void rosShutdown();
  void image_val(QImage);//信号函数，发送信号给UI界面，UI收到信号后就会执行某操作

  void tracking_val(int, int, int, int);

private:
	int init_argc;
	char** init_argv;
	ros::Publisher chatter_publisher;
        ros::Publisher rectangle_publisher;
    QStringListModel logging_model;
    image_transport::Subscriber image_sub;//订阅者，用来订阅ROS的某个话题，ROS的话题也像是一种信号，订阅者就是只接收这个话题信号的对象，不做其他操作。
    ros::Subscriber tarcking_rectangle_sub;

    void image_callback(const sensor_msgs::ImageConstPtr &msg);//回调函数，qnode的节点收到ROS的话题后，要执行什么操作，均有回调函数完成。
    void tracking_callback(const std_msgs::Int32MultiArrayConstPtr &msg);
    QImage Mat2QImage(cv::Mat const& src);//图像转换函数，主要是将ROS的图像数据化成Qt界面要识别的图像数据
};

}  // namespace ui_core

#endif /* ui_core_QNODE_HPP_ */
